package com.glls.lambda.demo5;

import com.glls.lambda.pojo.Student;
import com.sun.jmx.snmp.internal.SnmpSubSystem;
import org.junit.Test;

import java.util.Comparator;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * @date 2022/10/3
 * @desc  方法引用
 */
public class TestMethodRef {

    @Test
    public void test1(){
        Consumer<String> consumer = (s)->System.out.println(s);

        consumer.accept("hello lambda");

        //对象::实例方法     accept 这个抽象方法 和 println这个方法的参数列表一致  所以可以方法引用
        Consumer<String> consumer2 = System.out::println;

        consumer2.accept("hello method ref");

    }

    @Test
    public void test2(){
        BinaryOperator<Double> binaryOperator = (x,y)-> x>y?x:y;

        Double apply = binaryOperator.apply(8.5, 9.8);

        System.out.println(apply);

        // 类名::静态方法引用
        BinaryOperator<Double> binaryOperator2 = Math::pow;

        Double apply1 = binaryOperator2.apply(2.0, 3.0);

        System.out.println(apply1);

        BinaryOperator<Integer> binaryOperator3 = Integer::compare;  // 类名::静态方法
    }



    @Test
    public void test3(){
        // 类名::实例方法  写法
        BinaryOperator<Integer> binaryOperator = (num1,num2)->{return num1.compareTo(num2);};
        BinaryOperator<Integer> binaryOperator4 = Integer::compareTo;  // 类名::实例方法
    }


    @Test
    public void test4(){
        //类名::实例方法

        Comparator<Integer> comparator = (num1,num2)->{return  num1.compareTo(num2);};
        Comparator<Integer> comparator2 = Integer::compareTo;

        Student student = new Student();
        student.setName("海月");
        Function<Student,String> function = (stu) -> {return stu.getName();};

        String result = function.apply(student);

        System.out.println(result);
         // 类名::实例方法名
        Function<Student,String> function2 = Student::getName;

        // 什么情况 可以使用 类名::实例方法名
        //当在 lambda 体重  第一个参数是方法的调用者  第二个参数 是方法的参数时（当有两个参数的情况）
    }
}
